/*****************************************************************************
 * This file is part of the Prolog Development Tool (PDT)
 * 
 * Author: Lukas Degener (among others) 
 * E-mail: degenerl@cs.uni-bonn.de
 * WWW: http://roots.iai.uni-bonn.de/research/pdt 
 * Copyright (C): 2004-2006, CS Dept. III, University of Bonn
 * 
 * All rights reserved. This program is  made available under the terms 
 * of the Eclipse Public License v1.0 which accompanies this distribution, 
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * In addition, you may at your option use, modify and redistribute any
 * part of this program under the terms of the GNU Lesser General Public
 * License (LGPL), version 2.1 or, at your option, any later version of the
 * same license, as long as
 * 
 * 1) The program part in question does not depend, either directly or
 *   indirectly, on parts of the Eclipse framework and
 *   
 * 2) the program part in question does not include files that contain or
 *   are derived from third-party work and are therefor covered by special
 *   license agreements.
 *   
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *   
 * ad 1: A program part is said to "depend, either directly or indirectly,
 *   on parts of the Eclipse framework", if it cannot be compiled or cannot
 *   be run without the help or presence of some part of the Eclipse
 *   framework. All java classes in packages containing the "pdt" package
 *   fragment in their name fall into this category.
 *   
 * ad 2: "Third-party code" means any code that was originaly written as
 *   part of a project other than the PDT. Files that contain or are based on
 *   such code contain a notice telling you so, and telling you the
 *   particular conditions under which they may be used, modified and/or
 *   distributed.
 ****************************************************************************/

package org.cs3.pl.common;

import java.io.IOException;
import java.io.InputStream;

public class LoggingInputStream extends InputStream{
	InputStream impl;
	LogBuffer log;
	private String key="read";
	

	public LoggingInputStream(InputStream impl, LogBuffer log, String key) {
		super();
		this.impl = impl;
		this.log = log;
		this.key = key;
	}
	public LoggingInputStream(InputStream impl, LogBuffer log) {
		super();
		this.impl = impl;
		this.log = log;	
	}

	
	
	
	public int available() throws IOException {
		int i = impl.available();
		//log.log(key+":available",""+i);
		return i;
	}
	public boolean markSupported() {
		boolean b = impl.markSupported();
		//log.log(key+":available",""+b);		
		return b;
	}
	public void close() throws IOException {
		log.log(key+":close","closing target.");
		impl.close();
	}

	public synchronized void mark(int readlimit) {
		log.log(key+":mark","readlimit="+readlimit);
		impl.mark(readlimit);
	}


	public int read() throws IOException {
		int i = impl.read();
		if(i==-1){
			log.log(key,"##EOF##");
		}else{
			log.log(key,(char)i);
		}
		return i;
	}

	public int read(byte[] b, int off, int len) throws IOException {
		int i = impl.read(b, off, len);
		log.log(key,b,off,i);
		return i;
	}

	public int read(byte[] b) throws IOException {
		int i= impl.read(b);
		log.log(key,b,0,i);
		return i;
	}

	public synchronized void reset() throws IOException {
		log.log(key+":reset","reseting target");
		impl.reset();
	}

	public long skip(long n) throws IOException {

		long remaining = n;
		int nr;
		

		int bufsize = (int)Math.min(Integer.MAX_VALUE, n);
		byte[] localSkipBuffer = new byte[bufsize];
			
		if (n <= 0) {
		    return 0;
		}

		while (remaining > 0) {
		    nr = read(localSkipBuffer, 0,
			      (int) Math.min(bufsize, remaining));
		    if (nr < 0) {
			break;
		    }
		    remaining -= nr;
		}
		
		int read = (int) (n - remaining);
		log.log(key+":skip",localSkipBuffer,0,read);
		return read;
	}

	

}
